<?php
/**
 * Created by a front-end programmer.
 * User: Xwen
 * Date: 2018/1/23
 * Time: 17:54
 * Mail:lauwencn@gmail.com
 */
/**
 * 打印用户定义的常量
 * get_defined_constants()打印所有常量,加入参数true后把不同定义的以二维数组形式区分开
 * $const['user'] 取得常量中用户定义的部分
 */
function print_const(){
    $const = get_defined_constants(true);
    P($const['user']);
}
/**
 * 错误跳转方法
 * @param $error 错误信息（字符串或者数组）
 * @param string $level 错误等级（默认ERROR）
 * @param int $type 日志写入类型(默认3，写入文件)
 * @param null $dest    日志写入路径（默认空）
 */
function half($error, $level='ERROR', $type=3, $dest=NULL){
    if(is_array($error)){
        Log::write($error['message'], $level, $type, $dest);
    }else{
        Log::write($error, $level, $type, $dest);
    }
    $e = array();
    if(DEBUG){
        if(!is_array($error)){
            $trace = debug_backtrace();
            $e['message'] = $error;
            $e['level'] = $level;
            $e['file'] = $trace[0]['file'];
            $e['line'] = $trace[0]['line'];
            $e['class'] = isset($trace[0]['class']) ? $trace[0]['class'] : '';
            $e['function'] = isset($trace[0]['function']) ? $trace[0]['function'] : '';
            ob_start();
            debug_print_backtrace();
            $e['trace'] = htmlspecialchars(ob_get_clean());
        }else{
            $e = $error;
        }
    }else{
        if($url = C('ERROR_URL')){
            go($url);
        }else{
            $e['message'] = C('ERROR_MSG');
        }
    }
    include TPL_PATH.'/half.html';
    die;
}

/**
 * @param $arr  需要打印的参数
 * 能打印函数，打印布尔值、空值和其它
 */
function P($arr){
    echo "<pre style='background-color: #f5f5f5;border-radius: 5px;padding: 10px;border: 1px solid #ccc;font-size: 16px;'>";
    if(is_bool($arr)){
        var_dump($arr);
    }else if(is_null($arr)){
        var_dump($arr);
    }else{
        print_r($arr);
    }
    echo "</pre>";
}

/**
 * 跳转函数
 * @param $url  跳转地址
 * @param int $time 跳转时间
 * @param string $msg   跳转提示
 */
function go($url, $time=0, $msg=''){
    if(!headers_sent()){
        $time == 0 ? header("Location:".$url) : header("refresh:{$time};url={$url}");
        die($msg);
    }else{
        echo "<meta http-equiv='Refresh' content='{$time};URL={$url}'/>";
        if($time) die($msg);
    }
}

/**
 * @param null $var
 * @param null $value
 * 1.加载配置项：框架默认配置项、用户自定义配置项
 * 2.读取配置项：根据配置项名读取
 * 3.临时动态修改配置项：同时传入配置名和配置值
 */
function C($var = NULL, $value = NULL){
    static $config = array();
    //只有一个参数传递并且是数组时
    if(is_array($var)){
        $config = array_merge($config, array_change_key_case($var, CASE_UPPER));
        return;
    }
    //当第一个参数是字符串时
    if(is_string($var)){
        $var = strtoupper($var);
        //当第一个参数是字符串，且第二个参数不为空时
        if(!is_null($value)){
            $config[$var] = $value;
            return;
        }
        //当第一个参数是字符串，且第二个参数为空时，返回该配置项
        return isset($config[$var]) ? $config[$var] : NULL;
    }
    if(is_null($var) && is_null($value)){
        return $config;
    }
}

/**
 * 返回实例化后的Model对象
 * @param $table
 * @return Model
 */
function M($table){
    $obj = new Model($table);
    return $obj;
}

/**
 * 返回实例化后的扩展模型对象
 * @param $model
 * @return mixed
 */
function K($model){
    $model .= 'Model';
    return new $model;
}




?>